package com.itcam.phaseii.innerclass;

public class StaticInnerClass01 {
    public static void main(String[] args) {
        OuterS outerS = new OuterS();
        outerS.m1();

        // 外部其他类使用静态内部类
        //方式1
        //因为静态内部类，是可以通过类名直接访问(前提是满足访问权限)
        OuterS.InnerS innerS = new OuterS.InnerS();
//        OuterS.InnerS innerS1 = outerS.new InnerS();
        innerS.say();
        //方式2
        //编写一个方法，可以返回静态内部类的对象实例.
        OuterS.InnerS innerSS = outerS.getInnerS();
        System.out.println("============");
        innerSS.say();
        OuterS.InnerS inner10_ = OuterS.getInnerS_();
        System.out.println("************");
        inner10_.say();
    }
}

class OuterS { //外部类
    private int n1 = 10;
    private static String name = "张三";

    private static void cry() {
    }

    //InnerS 就是静态内部类
    //1. 放在外部类的成员位置
    //2. 使用static 修饰
    //3. 可以直接访问外部类的所有静态成员，包含私有的，但不能直接访问非静态成员
    //4. 可以添加任意访问修饰符(public、protected 、默认、private),因为它的地位就是一个成员
    //5. 作用域：同其他的成员，为整个类体
    static class InnerS {
        private static String name = "韩顺平教育";

        public void say() {
        //如果外部类和静态内部类的成员重名时，静态内部类访问的时，
        //默认遵循就近原则，如果想访问外部类的成员，则可以使用（外部类名.成员）
            System.out.println(name + " 外部类name= " + OuterS.name);
            cry();
        }
    }

    public void m1() { //外部类---访问------>静态内部类访问方式：创建对象，再访问
        InnerS innerS = new InnerS();
        innerS.say();
    }

    public InnerS getInnerS() {
        return new InnerS();
    }

    public static InnerS getInnerS_() {
        return new InnerS();
    }
}
